import java.util.HashMap;
import java.util.Map;

public class test3 {
    public static void main(String[] args) {
//        System.out.println(lengthOfLongestSubstring("abcabcbb"));//3
//        System.out.println( lengthOfLongestSubstring("bbbbb"));//1
//        System.out.println(lengthOfLongestSubstring("pwwkew"));//3
//        System.out.println(lengthOfLongestSubstring(""));//0
//        System.out.println(lengthOfLongestSubstring("au"));//2
//        System.out.println(lengthOfLongestSubstring("dvdf"));
        System.out.println(lengthOfLongestSubstring("abba"));
    }

//    start 不重复串的开始位置 遇到历史重复的元素需往后移一位，【且不能小于当前start  例如abba，第一次b重复start0->2 第二次a重复2->2】
//    end 不重复串结束位置  从头到尾遍历
//    max 保留每次遍历最大长度
//    map(元素，元素位置+1)  保存历史元素，并用于start判断是否重复,重复时更新value值
//
    public static int lengthOfLongestSubstring(String s) {
        if (s.length() <= 1) return s.length();
        int max = 0;
        Map<Character, Integer> map = new HashMap<>();
        for (int start = 0, end = 0; end < s.length(); end++) {
            Character c = s.charAt(end);
            if (map.containsKey(c)) {
                start = Math.max(map.get(c),start);
            }
            map.put(c, end + 1);
            max = Math.max(max, end - start + 1);
        }
        return max;
    }

}
